package 基础语法;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.PrintStream;

public class 文件与异常 {// IO就是字节流（全部基础俩抽象楼Input、OutStream）和字符流（全部继承Writer和Reader）
    public static void main(String[] args) throws Exception {// throws属于编译时异常

    }

    static void ExceptionRelete() throws Exception {

        FileInputStream f = new FileInputStream("./数组.java");
        FileOutputStream fo = new FileOutputStream("null");
        try {
            byte[] b = new byte[1024];// 1kb
            int len;
            while ((len = f.read(b)) != -1) {// 当读到最后几个字节时，若覆盖不满byte数组，就只会覆盖数组前几位，此时len的作用就体现了
                System.out.println(new String(b, len));

            }
        } catch (Exception e) {
            throw new Exception("finally被执行");// 属于运行时异常
        } finally {// 确保关闭
            f.close();

        }

        try (FileInputStream f1 = new FileInputStream("./数组.java");
                FileOutputStream fo1 = new FileOutputStream("null");) {// jdk7写法，自动释放资源，不用手动在finally释放资源.要求写在里面的类
                                                                       // 实现AutoCloseable

        } catch (Exception e) {
            throw new Exception("finally被执行");// 属于运行时异常
        }

        try (f; fo) {// jdk9写法，自动释放资源，不用手动在finally释放资源.要求写在里面的类 实现AutoCloseable

        } catch (Exception e) {
            throw new Exception("finally被执行");// 属于运行时异常
        }
    }

    static void other() {
        PrintStream ps = System.out;// 源码中out就是一个打印流对象，有虚拟机在运行时创建
        ps.println("和零零零零");// 控制台输出
        PrintStream pStream = new PrintStream(System.out);
        pStream.println("aaaaaaaaa");// 控制台输出

        try(TestAutoClose t=new TestAutoClose()){

        }


    }
}



class TestAutoClose implements AutoCloseable{
    public void close(){
        System.out.println("我被自动调用了");
    }
}